4.8 Series和DataFrame数据的替换
1、Series数据的替换
在数据清洗时,经常需要对字符串做替换处理,其目的是将不规则的字符结构统一,使其标准化,pandas中的s.str.replace()函数可以满足需求,结构如下:
s.str.replace(pat,rep,n=-1,case=None,flags,regex=None)
pat :要查找的字符串或表达式
repl :替换字符串或可调用字符串(函数)
n :要进行的替换数,默认全部替换
case :是否区别大小写
flags :re模块的标记
regex :是否设置为正则表达式模式
import pandas as pd,re
s=pd.Series([ "lily~25/98","Bob/14~94","Lucass~21~100" ])
t1=s.str.replace( "~","/" )
pat=re.compile( "[~/]" )
t2=s.str.replace(pat, "-" , regex = True ) #regex 默认为False,必须指定为True
t3=s.str.replace( "[a-zA-Z]+" , lambda m: "("+m[0]+")" , regex = True )
t4=s.str.replace( "([a-zA-Z]+)",r"【\1】" , regex = True )
print (t1)
print (t2)
print (t3)
print (t4)
返回:
0 | lily/25/98 |
1 | Bob/14/94 |
2 | Lucass/21/100 |
dtype: object
0 | lily-25-98 |
1 | Bob-14-94 |
2 | Lucass-21-100 |
dtype: object
0 | (lily)~25/98 |
1 | (Bob)/14~94 |
2 | (Lucass)~21~100 |
dtype: object
0 | 【lily】~25/98 |
1 | 【Bob】/14~94 |
2 | 【Lucass】~21~100 |
dtype: object
2、DataFrame数据的替换1
s.str.replace()函数只能在Series中的数据执行替换,并且只能做一个查找替换,如果希望在整个DataFrame表格中替换,并且同时做多个替换,可以用df.replace()函数,结构如下:
df.replace(to_replace=None,value=None,inplace=False,limit=None,regex=False,method=’pat’)
to_replace :查找要替换的值
Value :替换与查找要匹配的值
Inplace :就地修改,就是在原始表修改
Limit :向前或表后填充最大尺寸间隔
Regex :是否支持正则表达式,或者可以直接在此参数编写正则表达式。
Method :替换方法。
s.replace()函数是针对行或行的替换,语法与上面函数相同。
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换.xlsx" )
print (df)
print ("----------------------------")
t1=df.replace([ "李四","李四一" ], "李无四" )
t2=df.replace({
"李四":"lucas" ,
10:99
} )
print (t1)
print ("----------------------------------")
print (t2)
返回:
姓名1 | 销量1 | 姓名2 | 销售2 | |
---|---|---|---|---|
0 | 张三 | 10 | 李四 | 65 |
1 | 李四 | 85 | 小明 | 100 |
2 | 王二 | 63 | 李四一 | 10 |
--------------------------------------------------------
姓名1 | 销量1 | 姓名2 | 销售2 | |
---|---|---|---|---|
0 | 张三 | 10 | 李无四 | 65 |
1 | 李无四 | 85 | 小明 | 100 |
2 | 王二 | 63 | 李无四 | 10 |
---------------------------------------------------------
姓名1 | 销量1 | 姓名2 | 销售2 | |
---|---|---|---|---|
0 | 张三 | 99 | lucas | 65 |
1 | lucas | 85 | 小明 | 100 |
2 | 王二 | 63 | 李四一 | 99 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换.xlsx" )
print (df)
print ("----------------------------------------------------")
t=df.replace({
"姓名2" :{
"小明":"李明" ,
"李四一":"李四"
},
"销量1" :{ 10:100 }
} )
print (t)
返回:
姓名1 | 销量1 | 姓名2 | 销售2 | |
---|---|---|---|---|
0 | 张三 | 10 | 李四 | 65 |
1 | 李四 | 85 | 小明 | 100 |
2 | 王二 | 63 | 李四一 | 10 |
----------------------------------------------------
姓名1 | 销量1 | 姓名2 | 销售2 | |
---|---|---|---|---|
0 | 张三 | 100 | 李四 | 65 |
1 | 李四 | 85 | 李明 | 100 |
2 | 王二 | 63 | 李四 | 10 |
2、DataFrame数据的替换2
正则替换,就是将正则表达式应用在数据替换中,在编写正则表达式时,可以写在df.replace()函数的to_replace和regex这两个参数中
(1)单值正则替换
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换2.xlsx" )
print (df)
t1=df.replace(
regex = "(?<=\D)(\d+)" ,
value =r "-\1"
)
print (t1)
返回:
月份 | 语文 | 数学 | |
---|---|---|---|
0 | 8月 | 李四98 | 李四119 |
1 | 9月 | 王二85 | 王麻子136 |
2 | 10月 | 陈七101 | 小飞130 |
月份 | 语文 | 数学 | |
---|---|---|---|
0 | 8月 | 李四-98 | 李四-119 |
1 | 9月 | 王二-85 | 王麻子-136 |
2 | 10月 | 陈七-101 | 小飞-130 |
(2)列表正则替换
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换2.xlsx" )
print (df)
t1=df.replace(
regex =[ "^","$" ],
value =[ "[","]" ]
)
print (t1)
返回:
月份 | 语文 | 数学 | |
---|---|---|---|
0 | [8月] | [李四98] | [李四119] |
1 | [9月] | [王二85] | [王麻子136] |
2 | [10月] | [陈七101] | [小飞130] |
(3)字典正则替换
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换2.xlsx" )
print (df)
t1=df.replace(
regex ={ "^":"(" ,
"$":")" }
)
print (t1)
t2=df.replace(
to_replace={ "月份" : "^","数学":"$" },
value ={ "月份" : "<","数学":">" },
regex = True
)
print (t2)
返回:
月份 | 语文 | 数学 | |
---|---|---|---|
0 | 8月 | 李四98 | 李四119 |
1 | 9月 | 王二85 | 王麻子136 |
2 | 10月 | 陈七101 | 小飞130 |
月份 | 语文 | 数学 | |
---|---|---|---|
0 | (8月) | (李四98) | (李四119) |
1 | (9月) | (王二85) | (王麻子136) |
2 | (10月) | (陈七101) | (小飞130) |
月份 | 语文 | 数学 | |
---|---|---|---|
0 | <8月 | 李四98 | 李四119> |
1 | <9月 | 王二85 | 王麻子136> |
2 | <10月 | 陈七101 | 小飞130> |
3、替换的实例应用1
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.替换实例1.xlsx" )
print (df)
df[ "姓名" ]=df.姓名.str.replace(pat= "(\d+)" ,repl= lambda m: "-END" +"0"*(3-len(m[0]))+m[0], regex = True )
#(3-len(m[0]))为补足0的个数
#"0"*个数 表示字符为0的个数扩展
print (df)
返回:
姓名 | 业绩 | |
---|---|---|
0 | 张三5 | 45232 |
1 | 李四78 | 420000 |
2 | 王麻子999 | 188000 |
3 | 小曾3 | 360000 |
姓名 | 业绩 | |
---|---|---|
0 | 张三-END005 | 45232 |
1 | 李四-END078 | 420000 |
2 | 王麻子-END999 | 188000 |
3 | 小曾-END003 | 360000 |
4、替换的实例应用2
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.DataFrame替换2.xlsx" )
print (df)
df.月份.replace(
to_replace = "(^\d月)" ,
value =r "0\1" ,
regex = True ,
inplace = True
)
df.iloc[:, 1 :]=df.iloc[:, 1 :].replace(
regex ={
"(?<=\D)(?=\d)":"(" ,
"$":")"
},)
print (df)
返回:
月份 | 语文 | 数学 | |
---|---|---|---|
0 | 8月 | 李四98 | 李四119 |
1 | 9月 | 王二85 | 王麻子136 |
2 | 10月 | 陈七101 | 小飞130 |
月份 | 语文 | 数学 | |
---|---|---|---|
0 | 08月 | 李四(98) | 李四(119) |
1 | 09月 | 王二(85) | 王麻子(136) |
2 | 10月 | 陈七(101) | 小飞(130) |